/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sessions;

import entities.Actualite;
import entities.Commentaire;
import entities.Enseigne;
import entities.Note;
import entities.Utilisateur;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Vector;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Mic
 */
@Stateless
@LocalBean
public class GestionnaireEnseigne {

    @PersistenceContext(unitName = "TheCityRater-ejbPU")
    private EntityManager em;

    public void persist(Object object) {
        em.persist(object);
    }

    public void creerEnseigne(Enseigne enseigne) {
        persist(enseigne);
    }

    public Enseigne getEnseigne(Long idE) {
        Query q = em.createQuery("select e from Enseigne e where e.id = :id");
        q.setParameter("id", idE);
        return (Enseigne) q.getSingleResult();
    }

    public List<Enseigne> getEnseignes() {
        Query q = em.createQuery("select e from Enseigne e");
        return q.getResultList();
    }

    public List<Enseigne> getEnseignes(String nomE, String villeE, String type) {
        String query = "";
        if (type != null) {
            if (!type.equals("")) {
                query = "select e from " + type + " e where 1=1";
            }
        } else {
            query = "select e from Enseigne e where 1=1";
        }
        if (nomE != null) {
            if (!nomE.equals("")) {
                query += " and e.nom LIKE '%" + nomE + "%'";
            }
        }
        if (villeE != null) {
            if (!villeE.equals("")) {
                query += " and e.ville LIKE '%" + villeE + "%'";
            }
        }
        Query q = em.createQuery(query);

        return q.getResultList();
    }

    public int getCount(String type) {
        return Integer.parseInt(em.createNamedQuery(type + ".count").getSingleResult().toString());
    }

    public List<Enseigne> getEnseignes(String type, int start, int nbUsers, String sortField, String sortOrder) {
        Query q;
        if (sortField == null) {
            q = em.createNamedQuery(type + ".findAll");
        } else {
            q = em.createQuery("SELECT c FROM " + type + " c ORDER BY c." + sortField + " " + sortOrder);
        }
        q.setFirstResult(start);
        q.setMaxResults(nbUsers);

        return q.getResultList();
    }

    public Enseigne getEnseigne(Long id, String type) {
        Query q = em.createQuery("Select u from " + type + " u where u.id = :id");
        q.setParameter("id", id);
        return (Enseigne) q.getSingleResult();
    }

    public void supprimerEnseigne(Enseigne enseigne) {
        em.remove(em.merge(enseigne));
    }

    public List<Enseigne> rechercheEnseignePag(String nomE, String villeE, String type, int start, int nb) {
        String query = "";
        if (!type.equals("Tout")) {
            query = "select e from " + type + " e where 1=1";
        } else {
            query = "select e from Enseigne e where 1=1";
        }
        if (nomE != null) {
            if (!nomE.equals("")) {
                query += " and e.nom LIKE '%" + nomE + "%'";
            }
        }
        if (villeE != null) {
            if (!villeE.equals("")) {
                query += " and e.ville LIKE '%" + villeE + "%'";
            }
        }
        Query q = em.createQuery(query);
        q.setFirstResult(start);
        q.setMaxResults(nb);

        return q.getResultList();
    }

    public float getNoteEnseigne(Long id) {
        Vector<Note> notes = (Vector<Note>) getEnseigne(id, "Enseigne").getNotes();
        double cumulNote = 0;
        for (int i = 0; i < notes.size(); i++) {
            cumulNote += notes.get(i).getNote();
        }
        return (Float.parseFloat(String.valueOf(cumulNote)) / notes.size());
    }

    public List<Enseigne> getRecentEnseigne(int nbEnseigne, String type) {
        Query q = em.createQuery("select e from Enseigne e order by e.dateCreation desc");
        q.setFirstResult(0);
        q.setMaxResults(nbEnseigne);
        return q.getResultList();
    }

    public List<Enseigne> getBestNote(int nbEnseigne, String type) {
        Query q = em.createQuery("select e from Enseigne e order by e.noteCumulee desc");
        q.setFirstResult(0);
        q.setMaxResults(nbEnseigne);
        return q.getResultList();
    }

    public void enseigneUpdate(Enseigne enseigne) {
        em.merge(enseigne);
    }

    public void enseigneDelete(Enseigne enseigne) {
        em.remove(enseigne);
    }

    public boolean estProrietaire(Long idCommercant, Long idEnseigne) {
        Query q = em.createQuery("Select e from Enseigne e where e.id = :id");
        q.setParameter("id", idEnseigne);
        Enseigne enseigne = (Enseigne) q.getSingleResult();
        if (enseigne.getCommercant() != null) {
            return (enseigne.getCommercant().getId().equals(idCommercant));
        } else {
            return false;
        }

    }

    public Collection<Enseigne> getEnseigneUserCo(Long idConnecte) {
        Query q = em.createQuery("select e from Enseigne e where e.commercant.id =:idCo");
        q.setParameter("idCo", idConnecte);
        return q.getResultList();
    }
    
    public Collection<Enseigne> getEnseigneUser(Long idUser)
    {
        Query q = em.createQuery("select e from Enseigne e where e.commercant.id =:idCo");
        q.setParameter("idCo",idUser);
        return q.getResultList();
    }
    
    /////////// PARTIE ACTUALITE

    public List<Actualite> getActualites(Long idEnseigne) {
        Enseigne enseigne = getEnseigne(idEnseigne);
        return (List<Actualite>) enseigne.getActualites();
    }

    public void addActualite(Long idEnseigne, Actualite actu) {
        Enseigne enseigne = getEnseigne(idEnseigne);
        enseigne.getActualites().add(actu);
        em.merge(enseigne);
    }

    public Actualite getActualite(Long idActualite) {
        Query q = em.createQuery("select a from Actualite A where a.id = :idA");
        q.setParameter("idA", idActualite);
        return (Actualite) q.getSingleResult();
    }

    public void deleteActualite(Long idActu) {
        em.remove(em.merge(getActualite(idActu)));
    }

    //////////// PARTIE NOTE
    public void addNote(Note n, Long idEnseigne) {
        Enseigne enseigne = getEnseigne(idEnseigne);
        enseigne.getNotes().add(n);
        double newCumul = enseigne.getCumulNote() + n.getNote();
        enseigne.setCumulNote(newCumul);
        enseigneUpdate(enseigne);
        enseigne.setNote(getNoteEnseigne(idEnseigne));
        enseigneUpdate(enseigne);
    }

    public boolean verifVote(Long idEnseigne, Utilisateur u) {
        Query q = em.createQuery("select n from Note n where n.util.id=:idU");
        q.setParameter("idU", u.getId());
        Vector<Note> n = (Vector<Note>) q.getResultList();
        if (n.isEmpty()) {
            return true;
        } else {
            return false;
        }
    }
    /////////// PARTIE COMMENTAIRE

    public List<Commentaire> getCommentaires(Long idEnseigne) {
        Enseigne enseigne = getEnseigne(idEnseigne);
        return (List<Commentaire>) enseigne.getCommentaires();
    }

    public void addCommentaire(Long idE, Commentaire com) {
        Enseigne enseigne = getEnseigne(idE);
        enseigne.getCommentaires().add(com);
        em.merge(enseigne);
    }

    public Commentaire getCommentaire(Long idC) {
        Query q = em.createQuery("select c from Commentaire c where c.id = :idC");
        q.setParameter("idC", idC);
        return (Commentaire) q.getSingleResult();
    }

    public void deleteCommentaire(Long idC) {
        em.remove(em.merge(getCommentaire(idC)));
    }
}
